#ifndef _BLK_H
#define _BLK_H

#include <linux/sched.h>

/*
 * NR_REQUEST是请求队列的数量，注意到writes只会使用队列的低2/3
 * reads则可以使用全部
 * 
 * 32应该是一个合理的数字：足够从电梯机制中受益，但是又不会如此频繁的锁缓存块。 
 * 64看起来就太多了（在写/同步载荷重的场景下，很容易导致读取长时间被暂停）
 *
 */
#define NR_REQUEST	32

/**
 * 除了从软盘硬盘等地方加载数据到内存
 * 这个还可以处理分页请求，在处理分页请求时候，bh是NULL, waiting 是等待读写完成
 * */
struct request {
	/* 设备号，如果是-1表示无请求（请求数组中判断是否空闲，可用，就用的这个标志）*/
	int dev;		/* -1 if no request */
	/* 命令：读或写 */
	int cmd;		/* READ or WRITE */
	/* 错误码 */
	int errors;
	/* 扇区 */
	unsigned long sector;
	/* 扇区数量 */
	unsigned long nr_sectors;
	/* 指向内存区域（待从内存区域读或者要写入的内存区域）*/
	char * buffer;
	/* 在这个请求上等待的任务 */
	struct task_struct * waiting;
	/**
	 * 高速缓冲区块：
	 * 应该是所有从磁盘来的数据，都会先到高速缓冲区块，然后到 buffer 
	 * 或者所有要写入到磁盘的数据，都是从buffer先挪到高速缓冲区块，然后写入到真正的磁盘中
	 * */
	struct buffer_head * bh;
	/* 链接到下一个请求 */
	struct request * next;
};

#endif /* _BLK_H */